Point per-vcpu vcpu_info at a dummy structure by default, avoiding
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 29 Oct 2009 11:14:54 +0000 (11:14 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 29 Oct 2009 11:14:54 +0000 (11:14 +0000)
need for scattered NULL-pointer checks.

Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/domain.c
xen/common/domain.c
xen/common/event_channel.c
xen/common/keyhandler.c
xen/include/asm-x86/shared.h
xen/include/xen/shared.h

index 49662661df3724d259cfd3e59658ac373de3d639..7c22d131b83a207b550cca6e6710dd4c396fb0ab 100644 (file)
@@ -832,7 +832,6 @@ void arch_vcpu_reset(struct vcpu *v)
 static void
 unmap_vcpu_info(struct vcpu *v)
 {
-    struct domain *d = v->domain;
     unsigned long mfn;
 
     if ( v->arch.vcpu_info_mfn == INVALID_MFN )
@@ -841,7 +840,7 @@ unmap_vcpu_info(struct vcpu *v)
     mfn = v->arch.vcpu_info_mfn;
     unmap_domain_page_global(v->vcpu_info);
 
-    v->vcpu_info = (void *)&shared_info(d, vcpu_info[v->vcpu_id]);
+    v->vcpu_info = &dummy_vcpu_info;
     v->arch.vcpu_info_mfn = INVALID_MFN;
 
     put_page_and_type(mfn_to_page(mfn));
@@ -885,13 +884,7 @@ map_vcpu_info(struct vcpu *v, unsigned long mfn, unsigned offset)
 
     new_info = (vcpu_info_t *)(mapping + offset);
 
-    if ( v->vcpu_info )
-        memcpy(new_info, v->vcpu_info, sizeof(*new_info));
-    else
-    {
-        memset(new_info, 0, sizeof(*new_info));
-        __vcpu_info(v, new_info, evtchn_upcall_mask) = 1;
-    }
+    memcpy(new_info, v->vcpu_info, sizeof(*new_info));
 
     v->vcpu_info = new_info;
     v->arch.vcpu_info_mfn = mfn;
index f07d800cfcc4e95de25e692b83e66743f676b3b9..468f3476ae15e15261f7ccb278f4b4f9db6edad0 100644 (file)
@@ -87,6 +87,8 @@ struct domain *dom0;
 
 struct vcpu *idle_vcpu[NR_CPUS] __read_mostly;
 
+vcpu_info_t dummy_vcpu_info;
+
 int current_domain_id(void)
 {
     return current->domain->domain_id;
@@ -154,8 +156,9 @@ struct vcpu *alloc_vcpu(
         v->runstate.state = RUNSTATE_offline;        
         v->runstate.state_entry_time = NOW();
         set_bit(_VPF_down, &v->pause_flags);
-        if ( vcpu_id < XEN_LEGACY_MAX_VCPUS )
-            v->vcpu_info = (void *)&shared_info(d, vcpu_info[vcpu_id]);
+        v->vcpu_info = ((vcpu_id < XEN_LEGACY_MAX_VCPUS)
+                        ? (vcpu_info_t *)&shared_info(d, vcpu_info[vcpu_id])
+                        : &dummy_vcpu_info);
     }
 
     if ( sched_init_vcpu(v, cpu_id) != 0 )
@@ -754,9 +757,6 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg)
     switch ( cmd )
     {
     case VCPUOP_initialise:
-        if ( !v->vcpu_info )
-            return -EINVAL;
-
         if ( (ctxt = xmalloc(struct vcpu_guest_context)) == NULL )
             return -ENOMEM;
 
index 58be1729b0ea355dd9dc8f15e9f086ce85200e50..d052f15980d1a75d2ba9a522cb3e881a26b53132 100644 (file)
@@ -244,9 +244,6 @@ static long evtchn_bind_virq(evtchn_bind_virq_t *bind)
          ((v = d->vcpu[vcpu]) == NULL) )
         return -ENOENT;
 
-    if ( unlikely(!v->vcpu_info) )
-        return -EAGAIN;
-
     spin_lock(&d->event_lock);
 
     if ( v->virq_to_evtchn[virq] != 0 )
@@ -280,9 +277,6 @@ static long evtchn_bind_ipi(evtchn_bind_ipi_t *bind)
          (d->vcpu[vcpu] == NULL) )
         return -ENOENT;
 
-    if ( unlikely(!d->vcpu[vcpu]->vcpu_info) )
-        return -EAGAIN;
-
     spin_lock(&d->event_lock);
 
     if ( (port = get_free_port(d)) < 0 )
@@ -726,9 +720,6 @@ long evtchn_bind_vcpu(unsigned int port, unsigned int vcpu_id)
     if ( (vcpu_id >= d->max_vcpus) || (d->vcpu[vcpu_id] == NULL) )
         return -ENOENT;
 
-    if ( unlikely(!d->vcpu[vcpu_id]->vcpu_info) )
-        return -EAGAIN;
-
     spin_lock(&d->event_lock);
 
     if ( !port_is_valid(d, port) )
@@ -952,9 +943,6 @@ int alloc_unbound_xen_event_channel(
     struct domain *d = local_vcpu->domain;
     int            port;
 
-    if ( unlikely(!local_vcpu->vcpu_info) )
-        return -EAGAIN;
-
     spin_lock(&d->event_lock);
 
     if ( (port = get_free_port(d)) < 0 )
index 844d890df7e5e5724313cab1e64f1a1d1c39f27d..8ddfa95db938e52a0239f7f1356ee771f5e96338 100644 (file)
@@ -209,8 +209,8 @@ static void dump_domains(unsigned char key)
                    v->vcpu_id, v->processor,
                    v->is_running ? 'T':'F',
                    v->pause_flags, v->poll_evtchn,
-                   v->vcpu_info ? vcpu_info(v, evtchn_upcall_pending) : 0,
-                   v->vcpu_info ? vcpu_info(v, evtchn_upcall_mask) : 1);
+                   vcpu_info(v, evtchn_upcall_pending),
+                   vcpu_info(v, evtchn_upcall_mask));
             cpuset_print(tmpstr, sizeof(tmpstr), v->vcpu_dirty_cpumask);
             printk("dirty_cpus=%s ", tmpstr);
             cpuset_print(tmpstr, sizeof(tmpstr), v->cpu_affinity);
@@ -218,8 +218,6 @@ static void dump_domains(unsigned char key)
             arch_dump_vcpu_info(v);
             periodic_timer_print(tmpstr, sizeof(tmpstr), v->periodic_period);
             printk("    %s\n", tmpstr);
-            if ( !v->vcpu_info )
-                continue;
             printk("    Notifying guest (virq %d, port %d, stat %d/%d/%d)\n",
                    VIRQ_DEBUG, v->virq_to_evtchn[VIRQ_DEBUG],
                    test_bit(v->virq_to_evtchn[VIRQ_DEBUG], 
index d3584c0ac3fa80454cda5ae48707f80629272e77..ceca564d623d208b6a708f3da72ff53fb21b7428 100644 (file)
@@ -26,8 +26,6 @@ static inline void arch_set_##field(struct domain *d,           \
 #define GET_SET_VCPU(type, field)                               \
 static inline type arch_get_##field(const struct vcpu *v)       \
 {                                                               \
-    if ( unlikely(!v->vcpu_info) )                              \
-        return 0;                                               \
     return !has_32bit_shinfo(v->domain) ?                       \
            v->vcpu_info->native.arch.field :                    \
            v->vcpu_info->compat.arch.field;                     \
@@ -59,7 +57,7 @@ static inline void arch_set_##field(struct domain *d,           \
 #define GET_SET_VCPU(type, field)                               \
 static inline type arch_get_##field(const struct vcpu *v)       \
 {                                                               \
-    return v->vcpu_info ? v->vcpu_info->arch.field : 0;         \
+    return v->vcpu_info->arch.field;                            \
 }                                                               \
 static inline void arch_set_##field(struct vcpu *v,             \
                                     type val)                   \
index 3bbf133294e70fa64d9da5c28fd588a413c06e67..528c8b77c5ca00c6c3cfcc0acb2a124b491fccb2 100644 (file)
@@ -43,6 +43,8 @@ typedef struct vcpu_info vcpu_info_t;
 
 #endif
 
+extern vcpu_info_t dummy_vcpu_info;
+
 #define shared_info(d, field)      __shared_info(d, (d)->shared_info, field)
 #define vcpu_info(v, field)        __vcpu_info(v, (v)->vcpu_info, field)